/**
 * @description 过滤路由表
 * @param menu 没有meta的路由表（主要是mysql数据库的数据用）
 * @returns {Array}
 */
export function initRouter(menu: Menu.Original[]): Menu.MenuOptions[] {
  return menu.map((item: Menu.Original): Menu.MenuOptions => {
    let routeRecordRaw: Menu.MenuOptions = {
      id: item.id,
      parentID: item.parentID,
      path: item.path,
      name: item.name,
      component: item.component,
      children: item.children && item.children.length > 0 ? initRouter(item.children) : [],
      meta: {
        icon: item.icon,
        title: item.title,
        isLink: item.isLink,
        isHide: item.isHide ? true : false,
        isFull: item.isFull ? true : false,
        isAffix: item.isAffix ? true : false,
        isKeepAlive: item.isKeepAlive ? true : false,
        activeMenu:item.activeMenu,
      }
    };
    if (item.redirect) routeRecordRaw.redirect = item.redirect;
    return routeRecordRaw;
  });
}

export function flatMenu(menu: Menu.MenuOptions) {
  return {
    id: menu.id,
    parentID: menu.parentID,
    path: menu.path,
    name: menu.name,
    component: menu.component,
    // children: menu.children,
    redirect: menu.redirect,
    icon: menu.meta.icon,
    title: menu.meta.title,
    isLink: menu.meta.isLink, // 设置为指定的链接
    isHide: menu.meta.isHide ? 1 : 0, // 将布尔值转换为 0 或 1
    isFull: menu.meta.isFull ? 1 : 0,
    isAffix: menu.meta.isAffix ? 1 : 0,
    isKeepAlive: menu.meta.isKeepAlive ? 1 : 0,
    activeMenu:menu.meta.activeMenu,
  };
}

/**
 * @description 遍历菜单路由树形表（ts传id版，mysql数据库能用）
 * @param items 没有子路由children[]的路由表
 * @returns
 */
export function getMysqlTrees(items: Array<Menu.Original>): Array<Menu.Original> {
  const result: Array<Menu.Original> = []; // 存放结果集
  const itemMap: { [id: number]: Partial<Menu.Original> & { children: Array<Menu.Original> } } = {};
  for (const item of items) {
    const id = item.id!;
    const parentID = item.parentID!;

    if (!itemMap[id]) {
      itemMap[id] = {
        children: []
      };
    }

    itemMap[id] = {
      ...item,
      children: itemMap[id].children!
    };

    const treeItem = itemMap[id] as Menu.Original;

    if (parentID === 0) {
      result.push(treeItem);
    } else {
      if (!itemMap[parentID]) {
        itemMap[parentID] = {
          children: []
        };
      }
      ((itemMap[parentID] as Partial<Menu.Original> & { children: Array<Menu.Original> }).children || []).push(treeItem);
    }
  }
  return result;
}

/**
 * @description 遍历菜单路由树形表（any类型版id,_id都能用，js改ts改累了）
 * @param items 没有子路由children[]的路由表
 * @returns
 */
export function getMongoTrees(items: any[]) {
  const result: any[] = [];
  const itemMap: { [key: string]: any } = {};

  for (const item of items) {
    const id = item._id || item.id;
    const parentID = item.parentID;

    if (!itemMap[id]) {
      itemMap[id] = {
        ...item,
        children: []
      };
    } else {
      itemMap[id] = {
        ...itemMap[id],
        ...item,
        children: itemMap[id].children
      };
    }

    const treeItem = itemMap[id];

    if (parentID === 0) {
      result.push(treeItem);
    } else {
      if (!itemMap[parentID]) {
        itemMap[parentID] = {
          children: []
        };
      }
      itemMap[parentID].children.push(treeItem);
    }
  }

  return result;
}

/**
 * 按钮权限列表过滤
 * @param btn 未格式化的按钮列表
 * @returns { [key: string]: string[] }
 */
export function transformedBtn(btn: Buttons.Btn[]) {
  return btn.reduce((result, item) => {
    result[item.path] = item.buttons;
    return result;
  }, {} as Buttons.AuthButton);
}
